/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package metier;

import fenetre.view;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JProgressBar;
/**
 *
 * @author epulapp
 * Classe qui permet la génération du Noyau et du réseau
 */
public class ListPersonne {

    public static ArrayList<Personne> listePersonne;
    public static int nbPersonne = 100;
    public static int degre_celeb_liste = 0;

/*
 * Constructer générant le réseau avec un noyau de taille nbCreate
 */
    public static void ListPersonne(int nbCreate) {
        if (listePersonne == null) {
            listePersonne = new ArrayList<Personne>();
        }
        JProgressBar progres = view.returnBar();
            progres.setMaximum(nbCreate-1);
        for (int i = 0; i < nbCreate; i++) {
            
           progres.setValue(i);
            Personne p = new Personne();
            listePersonne.add(p);
         
            /*=================================
             *                Noyau 
             *=================================
             */
            if (listePersonne.size() < 20 && true) // On est dans le noyau 
            {
                if (i > 0) // Dans le cas ou il plusieurs elements dans la liste
                {
                    // Il va devenir l'ami de :
                    int nbAmi = (int) Math.floor(Math.random() * 20);

                    while (nbAmi > 0) {
                        int nouvelAmi = (int) Math.floor(Math.random() * listePersonne.size());
                        //On teste si l'ami existe et si ils ne sont dÃƒÂ©ja pas amis.
                        if (listePersonne.size() > nouvelAmi && listePersonne.get(i).estPasAmis(nouvelAmi) && nouvelAmi != i) {
                            //System.out.println("Personne numero : " + i + " veut etre ami avec : " + nouvelAmi);
                            listePersonne.get(i).addAmis(nouvelAmi);
                            // On rajoute au nouvel ami son ami
                            listePersonne.get(nouvelAmi).addAmis(i);
                            listePersonne.get(i).setDegre_celeb(listePersonne.get(i).getDegre_celeb() + 1);
                            listePersonne.get(nouvelAmi).setDegre_celeb(listePersonne.get(nouvelAmi).getDegre_celeb() + 1);
                            degre_celeb_liste++;
                        }
                        nbAmi --;
                    } 
                }
            } else 
             /*=================================
             *              Formule
             *=================================
             */
           {    
                 
                     
                //On parcours le noyau et on regarde la probabilite d'etre amis avec chaque personne
                 for(int j=0;j<i;j++)
                 {
                     // probabilité d'être amsi avec j
                     float prob = probPseudo(j);
                     // probabilitÃƒÂ© random entre 0 et 1
                     float probRandom = (float) Math.random();
                  //   System.out.println(probRandom+"\n")
                     
                     // Si la prob en fonction de son degres de celebritÃƒÂ© > a la probabilitÃƒÂ© alÃƒÂ©atoire, on ajoute l'ami
                     if(prob>probRandom)
                     {
                         listePersonne.get(i).addAmis(j);
                         // on ajoute nous meme dans le tableau de l'amis qu'on vient d'ajouter
                         listePersonne.get(j).addAmis(i);
                         
                         listePersonne.get(i).setDegre_celeb(listePersonne.get(i).getDegre_celeb()+1);
                         listePersonne.get(j).setDegre_celeb(listePersonne.get(j).getDegre_celeb()+1);
                         degre_celeb_liste++;
                     }
                             
                     
                        
                 }
                

           }
            // FIN AJOUT AMI        
        }
    }

    /*
     * Sert pour l'ancien QuickSort Non optimisé (Type tableau)
     *  , utilisé pour nos tests
     */
    public static Personne[] test() {
        try {
            Personne[] tmp;
            tmp = new Personne[nbPersonne]; 
            for (int i = 0; i < ListPersonne.getListePersonne().size(); i++) {
                tmp[i] = ListPersonne.getListePersonne().get(i);
            }
            
            return tmp;
        } catch (Exception e) {
        }
        return null;

    }
    
/*
 * Affiche la Liste avec Nom Prenom , utilisé pour nos tests
 */
    public static void afficheListeTri(Personne [] test) {
        for (int i = 0; i < nbPersonne; i++) {
            System.out.println("----- Affichage d'une nouvelle personne TRI -------- ");
            System.out.println("Nom :  " + test[i].getNom()+" "+test[i].getPrenom());
            System.out.println("");

        }
    }
    
    /*
     * Affiche la célébrité , utilisé pour nos tests
     */
    public static void afficheListeTriTest(Personne []tmp) {
        for (int i = 0; i < nbPersonne; i++) {
            System.out.println("CelebritÃƒÂ© :  " + tmp[i].getDegre_celeb()
                    );
        }
    }

    /*
     * Affiche tout, utilisé pour nos tests
     */
    public static void afficheListe() {
        for (int i = 0; i < getListePersonne().size(); i++) {
            System.out.println("----- Affichage d'une nouvelle personne -------- ");
            System.out.println("Nom :  "+listePersonne.get(i).getNom());
            System.out.println("Prenom :  "+listePersonne.get(i).getPrenom());
            System.out.println("Date :  "+listePersonne.get(i).getDate_nais());
            System.out.println("Centres d'intÃƒÂ©rÃƒÂªts :  "+listePersonne.get(i).getCentres_interet());
            System.out.println("Pseudo :  "+listePersonne.get(i).getPseudo());
            System.out.println("Est Amis avec  :  "+listePersonne.get(i).getToutAmis());
            System.out.println("Taux de CÃƒÂ©lÃƒÂ©britÃƒÂ© : "+listePersonne.get(i).getDegre_celeb());
           
            System.out.println("");

        }
    }

    /**
     * @return the listePersonne
     */
    public static ArrayList<Personne> getListePersonne() {
        return listePersonne;
    }

    /**
     * @param aListePersonne the listePersonne to set
     */
    public static void setListePersonne(ArrayList<Personne> aListePersonne) {
        listePersonne = aListePersonne;
    }

     public static int getDegreTotal() {
        int degre = 0;

        for (int i = 0; i<getListePersonne().size(); i++)
        {
            degre += listePersonne.get(i).getDegre_celeb();
        }
         return degre ;
     }
    
    /*
     *  Retourne la probabilité d'être amis avec j
     */
    public static float probPseudo(int j){
        
        // On récupère le nombre d'amis de la personne avec qui on veut être amis => Degrès de popularité
        int c = 2; // constante de la formule de probabilité 2 pour un degrés plus élevé
        float prob; // probabilité                     
        int deg=listePersonne.get(j).getDegre_celeb();
       
        // On recupere le degres totale de la liste
        //int somme_deg= ListPersonne.getDegreTotal();
        int somme_deg= ListPersonne.degre_celeb_liste;
      
        // Formule que l'on applique
        prob= (float)c*deg/somme_deg;
      
        return prob;
    }
    
    
}
